package facade.Administrador;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import dao.implementations.postgresql.Administrador.ProyectoDB;
import dao.implementations.postgresql.Gae.GaeDB;
import dao.implementations.postgresql.Socio.PautaEvaluacionDB;
import dao.interfaces.Administrador.IProyecto;
import dao.interfaces.Gae.IGae;
import dao.interfaces.Socio.IPautaEvaluacion;
import dao.transferObjects.Administrador.ProyectoTO;
import dao.transferObjects.Gae.GaeTO;
import dao.transferObjects.Socio.SocioTO;
import facade.FacadeBase;

public class FacadeProyecto  extends FacadeBase{

	 
	public int guardarProyecto(ProyectoTO proyecto) {
		 
		int resp = -1; 
		this.connection.setAutoCommit(false);
		
		IProyecto proyectoDB = new ProyectoDB(this.connection.getConnection());
		
		resp = proyectoDB.guardarProyecto(proyecto);
		
		if(resp > 0){
			this.connection.commit();
		}
		else{
			this.connection.rollback();
			resp = -1;
		}
	
		try{
			this.connection.getConnection().close();
		} catch (SQLException e)
		{
			e.printStackTrace();
		}
		
		return resp;
	}

	 
	public int modificarProyecto(ProyectoTO proyecto) {
		 
		int resp = -1; 
		this.connection.setAutoCommit(false);
		
		IProyecto proyectoDB = new ProyectoDB(this.connection.getConnection());
		
		resp = proyectoDB.modificarProyecto(proyecto);
		
		if(resp > 0){
			this.connection.commit();
		}
		else{
			this.connection.rollback();
			resp = -1;
		}
	
		try{
			this.connection.getConnection().close();
		} catch (SQLException e)
		{
			e.printStackTrace();
		}
		
		return resp;
	}
	
	public int asignarProyectoSocio(ProyectoTO proyecto, SocioTO socio) {
		 
		int resp = -1;
		List<GaeTO> listaGrupos = null;
		
		this.connection.setAutoCommit(false);
		
		IProyecto proyectoDB = new ProyectoDB(this.connection.getConnection());
		IGae gaeDB = new GaeDB(this.connection.getConnection());
		IPautaEvaluacion pautaEvaluacionDB = new PautaEvaluacionDB(this.connection.getConnection());
		
		//VERIFICAMOS QUE ALGUN GAE TIENE ASIGNADO EL PROYECTO
		//EN CASO DE EXISTIR, SE DEBE CREAR UNA PAUTA POR GAE ENCONTRADO
		listaGrupos = gaeDB.obtener_gaes_asociados_a_un_proyecto_X(proyecto);
		
		if(listaGrupos.size()>0){
			//AQUI DEBEMOS CREAR LAS PAUTAS
			for(int i=0;i<listaGrupos.size();i++){
				
				//CREAMOS LAS 2 PAUTAS
				resp = pautaEvaluacionDB.crearPautaEvaluacion(socio, listaGrupos.get(i));
				if(resp > 0)
					resp = pautaEvaluacionDB.crearPautaEvaluacion(socio, listaGrupos.get(i));
				
				if(resp<=0){
					resp = -1;
					break;
				}
			}
		}
		
		if(listaGrupos.size() == 0)
			resp = proyectoDB.asignarProyectoSocio(proyecto, socio);
		else{
			if(resp > 0)
				resp = proyectoDB.asignarProyectoSocio(proyecto, socio);
		}
		
		if(resp > 0){
			this.connection.commit();
		}
		else{
			this.connection.rollback();
			resp = -1;
		}
	
		try{
			this.connection.getConnection().close();
		} catch (SQLException e)
		{
			e.printStackTrace();
		}
		
		return resp;
	}
	
	public int desAsignarProyectoSocio(ProyectoTO proyecto, SocioTO socio) {
		 
		int resp = -1;
		List<GaeTO> listaGrupos = null;
		
		this.connection.setAutoCommit(false);
		
		IProyecto proyectoDB = new ProyectoDB(this.connection.getConnection());
		IGae gaeDB = new GaeDB(this.connection.getConnection());
		IPautaEvaluacion pautaEvaluacionDB = new PautaEvaluacionDB(this.connection.getConnection());
		
		//VERIFICAMOS QUE ALGUN GAE TIENE ASIGNADO EL PROYECTO
		//EN CASO DE EXISTIR, SE DEBE CREAR UNA PAUTA POR GAE ENCONTRADO
		listaGrupos = gaeDB.obtener_gaes_asociados_a_un_proyecto_X(proyecto);
		
		if(listaGrupos.size()>0){
			//AQUI DEBEMOS ELIMINAR LAS PAUTAS
			for(int i=0;i<listaGrupos.size();i++){
				resp = pautaEvaluacionDB.eliminarPautaEvaluacion(socio, listaGrupos.get(i));
				if(resp<=0){
					resp = -1;
					break;
				}
			}
		}
		
		//SI NO EXISTIN PAUTAS QUE DEBIAN SER ELIMINADAS
		if(listaGrupos.size() == 0)
			resp = proyectoDB.desAsignarProyectoSocio(proyecto, socio);
		else{
			//EN CASO DE HABER SIDO NECESARIO ELIMINAR ALGUNA PAUTA, resp debe ser mayor que 0
			if(resp > 0)
				resp = proyectoDB.desAsignarProyectoSocio(proyecto, socio);
		}
		
		if(resp > 0){
			this.connection.commit();
		}
		else{
			this.connection.rollback();
			resp = -1;
		}
	
		try{
			this.connection.getConnection().close();
		} catch (SQLException e)
		{
			e.printStackTrace();
		}
		
		return resp;
	}
	 
	public int eliminarProyecto(ProyectoTO proyecto) {
		 
		int resp = -1; 
		this.connection.setAutoCommit(false);
		
		IProyecto proyectoDB = new ProyectoDB(this.connection.getConnection());
		
		//VERIDICAR SI ESTA ASOCIADO A UN GAE EN CASO DE ESTARLO, NO SE PUEDE BORRAR.
		
		resp = proyectoDB.eliminarProyecto(proyecto);
		
		if(resp > 0){
			this.connection.commit();
		}
		else{
			this.connection.rollback();
			resp = -1;
		}
	
		try{
			this.connection.getConnection().close();
		} catch (SQLException e)
		{
			e.printStackTrace();
		}
		
		return resp;
	}

	 
	public ProyectoTO obtenerProyecto(int id_proyecto) {
		 
		ProyectoTO proyecto = new ProyectoTO();
		IProyecto proyectoDB = new ProyectoDB(this.connection.getConnection());
		
		proyecto = proyectoDB.obtenerProyecto(id_proyecto);
		
		this.closeConnection();		
		return proyecto;
	}

	 
	public List<ProyectoTO> obtenerTodosProyectos() {
		 
		List<ProyectoTO> listaProyectos = new ArrayList<ProyectoTO>();
		IProyecto proyectoDB = new ProyectoDB(this.connection.getConnection());
		
		listaProyectos = proyectoDB.obtenerTodosProyectos();
		
		this.closeConnection();		
		return listaProyectos;
	}
	
	public List<ProyectoTO> obtenerProyectosAsignados() {
		 
		List<ProyectoTO> listaProyectos = new ArrayList<ProyectoTO>();
		IProyecto proyectoDB = new ProyectoDB(this.connection.getConnection());
		
		listaProyectos = proyectoDB.obtenerProyectosAsignados();
		
		this.closeConnection();		
		return listaProyectos;
	}
	
	public List<ProyectoTO> obtenerProyectosNoAsignados(){
		List<ProyectoTO> listaProyectos = new ArrayList<ProyectoTO>();
		IProyecto proyectoDB = new ProyectoDB(this.connection.getConnection());
		
		listaProyectos = proyectoDB.obtenerProyectosNoAsignados();
		
		this.closeConnection();		
		return listaProyectos;
	}
	
	public List<ProyectoTO> obtenerProyectosAsignadosSocio(SocioTO socio){
		List<ProyectoTO> listaProyectos = new ArrayList<ProyectoTO>();
		IProyecto proyectoDB = new ProyectoDB(this.connection.getConnection());
		
		listaProyectos = proyectoDB.obtenerProyectosAsignadosSocio(socio);
		
		this.closeConnection();		
		return listaProyectos;
	}
	 
	public List<ProyectoTO> obtenerTodosProyectosReducido() {
		 
		return null;
	}

	 
	public int asignarSocio(int id_socio) {
		 
		return 0;
	}
	
	

}
